package com.mo;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@EnableFeignClients
@SpringBootApplication
public class NacosConsumerApplication {

    public static void main(String[] args) {

        SpringApplication.run(NacosConsumerApplication.class, args);
    }


    //初始化RestTemplate（spring提供）
    // HTTP请求工具，它提供了常见的REST请求方案的模版( GET 、POST 、PUT 、DELETE 等)
    //通过此对象可以远程调用
    @Bean //bean注解应用于配置类中，描述方法，方法的返回结果，交由spring管理
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    @Bean
    @LoadBalanced
    public RestTemplate loadBalancedRestTemplate(){
        return new RestTemplate();
    }


    @RestController
    public class ConsumerController{
        @Value("${spring.application.name}")
        private String applicationname;



        @Autowired
        private RestTemplate restTemplate;

        @Autowired   //负载均衡（基于一代cloud的netflix公司的Ribbon实现，默认轮询机制）
        private LoadBalancerClient loadBalancerClient;


        @GetMapping("/consumer/doRestEcho")
        public  String doRestEcho(){
            //直接定死写法，未在nacos查询
            //String url="http://localhost:8081/provider/echo/"+applicationname;
            //restTemplate.getForObject(url, String.class);
           // return restTemplate.getForObject(url, String.class);

            //写法一:基于服务名获取服务实例
            ServiceInstance serviceInstance =
                    loadBalancerClient.choose("nacos-provider");
            //获取实例对应的ip地址
           String host=serviceInstance.getHost();
            //获取实例对应的端口号
             int port=serviceInstance.getPort();
            //构建url
            String url=String.format("http://%s:%s/provider/echo/%s",
                    host, //传给第一个s
                    port,//第二个s
                    applicationname); //第三个s
              // return "666"+url;
                    //66http://192.168.108.1:8081/echo/nacos-consumer
              return restTemplate.getForObject(url, String.class);

        }



        //写法二:（直接基于服务名查询调用）
       //spring提供的负载均衡
        //注解描述restTemplate数，底层会再对RestTemplate服务，
        //调用时，会被一个负载均衡拦截器进行拦截，
        // 然后在基于特定的负载均衡算法进行服务的调用
        @Autowired
        private RestTemplate loadBalancedRestTemplate;

        @GetMapping("/consumer/doLoadBalanced")
        public String doRestLoadBalancedEcho(){
            String url=String.format(
                    "http://%s/provider/echo/%s",
                    "nacos-provider", //基于服务名，服务名下面可能会有多个实例（多个不同ip和端口）
                    applicationname );
           // return url;
            return loadBalancedRestTemplate.getForObject(url,String.class);
        }
    }
}

